package zwp.exercise.service.exercisedemo.chapterFour.PracticeAndExercises;

/**
 * @Author zwp14
 * @create 2025/11/26 22:46
 * @description 计算 1~20的阶乘的倒数之和
 */
public class ThreeExerciseDemo {
    private static final int END_NUM = 20;

    public static void main(String[] args) {

        // 计数 最大20，从1开始
        int countNum = 1;
        // 这是最后结果数，需要使用double类型，int 和 long类型都会将 小于1的小数取为0
        double allNum = 0;
        // 循环，限制基数最大为20
        while (END_NUM >= countNum) {

            // 调用递归方法计算阶乘，这里使用double, int 和 long类型都会将 小于1的小数取为0
            double i = methodRecursion(countNum);

            // 获取阶乘后的倒数，同理使用double
            double i1 = 1 / i;

            // 阶乘的倒数相加
            allNum = allNum + i1;
            System.out.println("第" + countNum + "次得到的allNum：" + allNum);
            // 递增，每次增加1
            countNum += 1;
        }

        System.out.println("最后结果：" + allNum);

    }


    /**
     * 采用递归方式计算阶乘
     *
     * @param countNum 计数
     * @return 阶乘结果
     */
    private static double methodRecursion(int countNum) {
        if (countNum == 1 || countNum == 0) {
            return 1;
        }
        return countNum * (countNum - 1) * methodRecursion(countNum - 2);
    }
}
